package br.com.ruidobrasil.util.componentes.upload {
	
	import br.com.ruidobrasil.manterpublicacao.PublicacaoEdicao;
	
	import flash.events.DataEvent;
	import flash.events.Event;
	import flash.events.IOErrorEvent;
	import flash.events.MouseEvent;
	import flash.net.FileFilter;
	import flash.net.FileReference;
	import flash.net.URLRequest;
	import flash.net.URLRequestMethod;
	import flash.net.URLVariables;
	
	import mx.controls.Alert;
	import mx.events.FlexEvent;
	import mx.rpc.events.FaultEvent;
	import mx.rpc.events.ResultEvent;
	import mx.rpc.http.HTTPService;
	
	public class Upload extends UploadView {
		
		private var file: FileReference;
		private var imageTypes: FileFilter;
		
		private var xmlProperties:XML;
		private var servicePropReader:HTTPService;
		public var servletUploadURL: String;
		private var _telaPai: PublicacaoEdicao;
		
		public function Upload() {
			super();
			
			this.addEventListener(FlexEvent.CREATION_COMPLETE, init);	
		}
		
		private function init(event: FlexEvent): void {
			
			limpar();
			
			file = new FileReference();
			file.addEventListener(Event.SELECT, selecionarArquivo);
			file.addEventListener(IOErrorEvent.IO_ERROR, erroSalvar);
			file.addEventListener(DataEvent.UPLOAD_COMPLETE_DATA, uploadComplete);
			
			imageTypes = new FileFilter("Images (*.jpg, *.jpeg, *.png, *.gif)", 
				"*.jpg; *.jpeg; *.png; *.gif;");
				
			btnProcurar.addEventListener(MouseEvent.CLICK, procurarArquivo);
			btnEnviar.addEventListener(MouseEvent.CLICK, enviarImagem);
			btnCancelar.addEventListener(MouseEvent.CLICK, cancelar);
			
			carregarArquivoProperties();
		}
		
		private function carregarArquivoProperties():void {
			servicePropReader = new HTTPService();
			servicePropReader.url = "assets/properties.xml";
			servicePropReader.resultFormat = "e4x";
			servicePropReader.contentType = "application/xml";

			servicePropReader.addEventListener(ResultEvent.RESULT, resultCarregarArquivoProperties);
			servicePropReader.addEventListener(FaultEvent.FAULT, faultCarregarArquivoProperties);
			servicePropReader.send();
		}
		
		private function resultCarregarArquivoProperties(event:ResultEvent):void {
			xmlProperties = XML(event.result);
			servletUploadURL = xmlProperties.property.(name == "ServletUpload").value;
		}
		
		private function faultCarregarArquivoProperties(event:FaultEvent):void {
			Alert.show(event.fault.message, "Não foi possível carregar o arquivo de propriedades.");
		}
		
		private function procurarArquivo(event:Event):void {
			file.browse([imageTypes]);
		}
		
		private function selecionarArquivo(event:Event):void {
			txtArquivo.text = file.name;
			btnEnviar.visible = true;
			btnCancelar.visible = true;
		}
		
		private function enviarImagem(event: MouseEvent): void {
			
			_telaPai.contadorImagens++;
			
			if (_telaPai.contadorImagens <= _telaPai.qtdMaximaUploadImagens) {
				
				var url:String = servletUploadURL;
				var request: URLRequest = new URLRequest(url);
				request.method = URLRequestMethod.POST;
				
				var variables: URLVariables = new URLVariables();
				variables.idPublicacao = _telaPai.vo.idPublicacao;
				request.data = variables;
				
				file.upload(request);
				btnEnviar.label = "Aguarde... Enviando...";
				btnEnviar.enabled = false;
				btnCancelar.visible = false;
				
			} else {
				var msg: String = "Só é permitido enviar " + _telaPai.qtdMaximaUploadImagens;
				
				if (_telaPai.qtdMaximaUploadImagens > 1) {
					msg += " imagens por publicação.";
				} else {
					msg += " imagem por publicação.";
				}
				
				Alert.show(msg, "Erro!");	
			}
		}
			
		private function uploadComplete(event:DataEvent):void {
			try {
				
				btnEnviar.enabled = true;
				limpar();
				
				var uploadEvent:UploadEvent = new UploadEvent("uploadevent");
				dispatchEvent(uploadEvent);
			}
			catch (error:Error) {
				Alert.show("Erro ao enviar a imagem: " + error.message, "Erro!");
			}
		}
		
		private function limpar(): void {
			btnEnviar.label = "Enviar Imagem";
			btnEnviar.visible = false;
			btnCancelar.visible = false;
			txtArquivo.text = "";
		}
		
		private function erroImagem(event:IOErrorEvent):void {
			txtArquivo.text = "Nenhuma imagem encontrada.";
			btnEnviar.visible = false;
			btnCancelar.visible = false;
		}
		
		private function erroSalvar(event:IOErrorEvent):void {
			Alert.show("Erro ao salvar a imagem: " + event.toString());
			btnCancelar.visible = false;
		}
		
		private function cancelar(event: MouseEvent): void {
			limpar();
		}
		
		public function set telaPai(telaPai: PublicacaoEdicao): void {
			_telaPai = telaPai;
		}
	}
}